package cn.ljy.authority.service.impl;

import cn.hutool.core.io.FileUtil;
import cn.ljy.authority.config.upload.FileUploadConfig;
import cn.ljy.authority.dao.mapper.SysFileResourceMapper;
import cn.ljy.authority.model.SysFileResource;
import cn.ljy.authority.model.query.SysFileResourceQuery;
import cn.ljy.authority.service.SysFileResourceService;
import cn.ljy.common.exception.model.MyWebException;
import cn.ljy.common.utils.file.MyFileOperator;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.springframework.validation.annotation.Validated;

import javax.validation.constraints.NotEmpty;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

@Service
//@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.DEFAULT,timeout=36000,rollbackFor= MyRollBackException.class)
@Validated//表示开启sprint的校检框架，会自动扫描方法里的@Valid（@Valid注解一般写在接口即可）
@Slf4j
public class ISysFileResourceService extends IBaseService<SysFileResource, SysFileResourceQuery> implements SysFileResourceService {

    @Autowired
    private SysFileResourceMapper mapper;
    @Autowired
    private FileUploadConfig fileUploadConfig;

    private void setParam(SysFileResource sysFileResource){
        //添加相关关联属性
        //将文件大小进行转换
        sysFileResource.setResourceSizePrint(MyFileOperator.convertToStringRepresentation(sysFileResource.getResourceSize()));
        //获取资源的绝对网址
        sysFileResource.setFileHttpUrl(super.getFileResourceWebUrl(sysFileResource.getFileUrl()));
    }

    @Override
    protected void afterFindAll(List<SysFileResource> list) {
        for(SysFileResource fileResource:list){
            //添加关联属性
            this.setParam(fileResource);
        }
    }

    @Override
    protected void afterGet(SysFileResource sysFileResource) {
        //添加关联属性
        this.setParam(sysFileResource);
    }

    @Override
    protected void beforeSaveOrUpdate(SysFileResource sysFileResource) {
        //因为添加和编辑都会有基本的字段类型，这里只要做更细致的验证即可
        if(sysFileResource.getAuthor()==null||sysFileResource.getAuthor().getId()==null){
            throw new MyWebException("验证失败：作者信息不能为空");
        }
        //不能为null，主要是为null时，wangeditor会出错。通常在编辑时，如果为NULL，连续打开2个不同记录会报错
        if(sysFileResource.getDescription()==null){
            sysFileResource.setDescription("");
        }
    }

    @Override
    protected void beforeSave(SysFileResource sysFileResource) {
        //如果没有传递可用性，则默认为true
        if(sysFileResource.getEnabled()==null){
            sysFileResource.setEnabled(true);
        }
    }

    @Override
    protected void beforeUpdate(SysFileResource sysFileResource) {
        if(sysFileResource.getLastAuthor()==null||sysFileResource.getLastAuthor().getId()==null){
            throw new MyWebException("验证失败：作者信息不能为空");
        }
        //不允许修改文件上传地址
        sysFileResource.setFileUrl(null);
    }

    @Override
    public void delete(@NotEmpty(message = "操作失败：请选择要移除的记录") Serializable[] ids) {
        //定义所有要删除的文件集合，用于在数据库记录删除后再统一删除文件
        List<String> filePaths=new ArrayList<>();
        //删除对应的文件
        for(Serializable id:ids){
            SysFileResource fileResource=mapper.findById(id);
            if(fileResource!=null){
                if(StringUtils.hasLength(fileResource.getFileUrl())){
                    String filePath=fileUploadConfig.getResourceUploadSavePath()+fileResource.getFileUrl();
                    if(FileUtil.exist(filePath)){//如果文件存在
                        filePaths.add(filePath);
                    }
                }
            }
        }
        //批量删除数据库记录
        super.delete(ids);
        //批量删除对应的文件
        for(String filePath:filePaths){
            //移除文件
            FileUtil.del(filePath);
        }
    }
}
